﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ПоказатьНастройкиВнешнихПользователей = Параметры.ПоказатьНастройкиВнешнихПользователей;
	ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей();
	
	ПредлагаемыеЗначенияНастроек = Новый Структура;
	ПредлагаемыеЗначенияНастроек.Вставить("МинимальнаяДлинаПароля", 8);
	ПредлагаемыеЗначенияНастроек.Вставить("МаксимальныйСрокДействияПароля", 30);
	ПредлагаемыеЗначенияНастроек.Вставить("МинимальныйСрокДействияПароля", 1);
	ПредлагаемыеЗначенияНастроек.Вставить("ЗапретитьПовторениеПароляСредиПоследних", 10);
	ПредлагаемыеЗначенияНастроек.Вставить("ПредупреждатьОбОкончанииСрокаДействияПароля", 5);
	ПредлагаемыеЗначенияНастроек.Вставить("ПросрочкаРаботыВПрограммеДоЗапрещенияВхода", 45);
	
	ПредлагаемыеЗначенияОбщихНастроек = Новый Структура;
	ПредлагаемыеЗначенияОбщихНастроек.Вставить("КоличествоПопытокВводаПароляДоБлокировки", 3);
	ПредлагаемыеЗначенияОбщихНастроек.Вставить("ДлительностьБлокировкиВводаПароля", 5);
	
	НастройкиВхода = ПользователиСлужебный.НастройкиВхода();
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		Элементы.ГруппаПредупреждатьОбОкончанииСрокаДействияПароля.Видимость = Ложь;
		Элементы.ГруппаПредупреждатьОбОкончанииСрокаДействияПароля2.Видимость = Ложь;
	КонецЕсли;
	
	ЗаполнитьНастройкиВФорме(НастройкиВхода.Общие, ПредлагаемыеЗначенияОбщихНастроек);
	ПоказыватьВСпискеВыбора = НастройкиВхода.Общие.ПоказыватьВСпискеВыбора;
	ОтдельныеНастройкиДляВнешнихПользователей = НастройкиВхода.Общие.ОтдельныеНастройкиДляВнешнихПользователей;
	
	ЗаполнитьНастройкиВФорме(НастройкиВхода.Пользователи, ПредлагаемыеЗначенияНастроек);
	ПарольДолженОтвечатьТребованиямСложности = НастройкиВхода.Пользователи.ПарольДолженОтвечатьТребованиямСложности;
	
	ЗаполнитьНастройкиВФорме(НастройкиВхода.ВнешниеПользователи, ПредлагаемыеЗначенияНастроек, Истина);
	ПарольДолженОтвечатьТребованиямСложности2 = НастройкиВхода.ВнешниеПользователи.ПарольДолженОтвечатьТребованиямСложности;
	
	Если ИспользоватьВнешнихПользователей Тогда
		Если ПоказатьНастройкиВнешнихПользователей Тогда
			Элементы.Страницы.ТекущаяСтраница = Элементы.ДляВнешнихПользователей;
		КонецЕсли;
		ОбновитьДоступностьНастроекВнешнихПользователей(ЭтотОбъект);
	Иначе
		Элементы.ДляВнешнихПользователей.Видимость = Ложь;
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		Элементы.ПредупреждениеНастройкаВСервисе.Видимость = Истина;
		Элементы.ФормаЗаписатьИЗакрыть.Доступность = Ложь;
		Элементы.Страницы.ТолькоПросмотр = Истина;
		Элементы.ПояснениеПоказыватьВСпискеВыбораРазделениеВключено.Видимость = Истина;
		Элементы.ПоказыватьВСпискеВыбора.Доступность = Ложь;
		
	ИначеЕсли ИспользоватьВнешнихПользователей Тогда
		Элементы.ПояснениеПоказыватьВСпискеВыбораВнешниеПользователи.Видимость = Истина;
		Элементы.ПоказыватьВСпискеВыбора.Доступность = Ложь;
	КонецЕсли;
	
	Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
		Элементы.ГруппаКоличествоПопытокВводаПароляДоБлокировки.Видимость = Ложь;
		Элементы.ГруппаДлительностьБлокировкиВводаПароля.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОтдельныеНастройкиДляВнешнихПользователейПриИзменении(Элемент)
	
	ОбновитьДоступностьНастроекВнешнихПользователей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПарольДолженОтвечатьТребованиямСложностиПриИзменении(Элемент)
	
	Если МинимальнаяДлинаПароля < 7 Тогда
		МинимальнаяДлинаПароля = 7;
	КонецЕсли;
	Если МинимальнаяДлинаПароля2 < 7 Тогда
		МинимальнаяДлинаПароля2 = 7;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура МинимальнаяДлинаПароляПриИзменении(Элемент)
	
	Если МинимальнаяДлинаПароля < 7
	  И ПарольДолженОтвечатьТребованиямСложности Тогда
		
		МинимальнаяДлинаПароля = 7;
	КонецЕсли;
	
	Если МинимальнаяДлинаПароля2 < 7
	  И ПарольДолженОтвечатьТребованиямСложности2 Тогда
		
		МинимальнаяДлинаПароля2 = 7;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкаВключитьПриИзменении(Элемент)
	
	ИмяВФорме = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) - СтрДлина("Включить"));
	ИмяНастройки = ?(СтрЗаканчиваетсяНа(ИмяВФорме, "2"),
		Лев(ИмяВФорме, СтрДлина(ИмяВФорме) - 1), ИмяВФорме);
	
	Если ЭтотОбъект[Элемент.Имя] = Ложь Тогда
		ЭтотОбъект[ИмяВФорме] = ПредлагаемыеЗначенияНастроек[ИмяНастройки];
	КонецЕсли;
	
	Элементы[ИмяВФорме].Доступность = ЭтотОбъект[Элемент.Имя];
	
КонецПроцедуры

&НаКлиенте
Процедура ОбщаяНастройкаВключитьПриИзменении(Элемент)
	
	ИмяНастройки = Лев(Элемент.Имя, СтрДлина(Элемент.Имя) - СтрДлина("Включить"));
	
	Если ЭтотОбъект[Элемент.Имя] = Ложь Тогда
		ЭтотОбъект[ИмяНастройки] = ПредлагаемыеЗначенияОбщихНастроек[ИмяНастройки];
	КонецЕсли;
	
	Элементы[ИмяНастройки].Доступность = ЭтотОбъект[Элемент.Имя];
	
	Если Элемент.Имя = "КоличествоПопытокВводаПароляДоБлокировкиВключить" Тогда
		Если ДлительностьБлокировкиВводаПароляВключить <> КоличествоПопытокВводаПароляДоБлокировкиВключить Тогда
			ДлительностьБлокировкиВводаПароляВключить = КоличествоПопытокВводаПароляДоБлокировкиВключить;
			ОбщаяНастройкаВключитьПриИзменении(Элементы.ДлительностьБлокировкиВводаПароляВключить);
		КонецЕсли;
	ИначеЕсли Элемент.Имя = "ДлительностьБлокировкиВводаПароляВключить" Тогда
		Если КоличествоПопытокВводаПароляДоБлокировкиВключить <> ДлительностьБлокировкиВводаПароляВключить Тогда
			КоличествоПопытокВводаПароляДоБлокировкиВключить = ДлительностьБлокировкиВводаПароляВключить;
			ОбщаяНастройкаВключитьПриИзменении(Элементы.КоличествоПопытокВводаПароляДоБлокировкиВключить);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьВСпискеВыбораОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьВСпискеВыбораОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если ПоказыватьВСпискеВыбора = ВыбранноеЗначение
	 Или ВыбранноеЗначение = "ВключеноДляНовыхПользователей"
	 Или ВыбранноеЗначение = "ВыключеноДляНовыхПользователей" Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	Оповещение = Новый ОписаниеОповещения("ПоказыватьВСпискеВыбораОбработкаВыбораЗавершение",
		ЭтотОбъект, ВыбранноеЗначение);
	
	Если ВыбранноеЗначение = "СкрытоИВключеноДляВсехПользователей" Тогда
		ТекстВопроса =
			НСтр("ru = 'При входе в программу список выбора пользователей станет полным
			           |(реквизит ""Показывать в списке выбора"" в карточках всех
			           | пользователей будет включен и скрыт).'");
	Иначе
		ТекстВопроса =
			НСтр("ru = 'При входе в программу список выбора пользователей станет пустым
			           |(реквизит ""Показывать в списке выбора"" в карточках всех
			           | пользователей будет очищен и скрыт).'");
	КонецЕсли;
	
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
	
	ЗаписатьНаСервере();
	Оповестить("Запись_НаборКонстант", Новый Структура, "НастройкиВходаПользователей");
	Закрыть();
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьДоступностьНастроекВнешнихПользователей(Форма)
	
	Форма.Элементы.ГруппаНастройки2.Доступность =
		Форма.ОтдельныеНастройкиДляВнешнихПользователей;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНастройкиВФорме(Настройки, ПредлагаемыеЗначенияНастроек, ДляВнешнихПользователей = Ложь)
	
	Для Каждого КлючИЗначение Из ПредлагаемыеЗначенияНастроек Цикл
		ИмяВФорме = КлючИЗначение.Ключ + ?(ДляВнешнихПользователей, "2", "");
		Если ЗначениеЗаполнено(Настройки[КлючИЗначение.Ключ]) Тогда
			ЭтотОбъект[ИмяВФорме + "Включить"] = Истина;
			ЭтотОбъект[ИмяВФорме] = Настройки[КлючИЗначение.Ключ];
		Иначе
			ЭтотОбъект[ИмяВФорме] = КлючИЗначение.Значение;
			Элементы[ИмяВФорме].Доступность = Ложь;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ЗаписатьНаСервере()
	
	НачатьТранзакцию();
	Попытка
		Общие = Пользователи.НовоеОписаниеОбщихНастроекВхода();
		ЗаполнитьНастройкиИзФормы(Общие, ПредлагаемыеЗначенияОбщихНастроек);
		Если ПодтвержденоМассовоеИзменениеСвойстваПоказыватьВСпискеВыбора
		   И Общие.ПоказыватьВСпискеВыбора <> ПоказыватьВСпискеВыбора
		   И (    ПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей"
		      Или ПоказыватьВСпискеВыбора = "СкрытоИВыключеноДляВсехПользователей") Тогда
			ПользователиСлужебный.УстановитьРеквизитПоказыватьВСпискеВыбораУВсехПользователейИБ(
				ПоказыватьВСпискеВыбора = "СкрытоИВключеноДляВсехПользователей");
		КонецЕсли;
		Общие.ПоказыватьВСпискеВыбора = ПоказыватьВСпискеВыбора;
		Общие.ОтдельныеНастройкиДляВнешнихПользователей = ОтдельныеНастройкиДляВнешнихПользователей;
		Пользователи.УстановитьОбщиеНастройкиВхода(Общие);
		
		НастройкиПользователей = Пользователи.НовоеОписаниеНастроекВхода();
		ЗаполнитьНастройкиИзФормы(НастройкиПользователей, ПредлагаемыеЗначенияНастроек);
		НастройкиПользователей.ПарольДолженОтвечатьТребованиямСложности = ПарольДолженОтвечатьТребованиямСложности;
		Пользователи.УстановитьНастройкиВхода(НастройкиПользователей);
		
		НастройкиВнешнихПользователей = Пользователи.НовоеОписаниеНастроекВхода();
		ЗаполнитьНастройкиИзФормы(НастройкиВнешнихПользователей, ПредлагаемыеЗначенияНастроек, Истина);
		НастройкиВнешнихПользователей.ПарольДолженОтвечатьТребованиямСложности = ПарольДолженОтвечатьТребованиямСложности2;
		Пользователи.УстановитьНастройкиВхода(НастройкиВнешнихПользователей, Истина);
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	ОбновитьПовторноИспользуемыеЗначения();
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНастройкиИзФормы(Настройки, ПредлагаемыеЗначенияНастроек, ДляВнешнихПользователей = Ложь)
	
	Для Каждого КлючИЗначение Из ПредлагаемыеЗначенияНастроек Цикл
		ИмяВФорме = КлючИЗначение.Ключ + ?(ДляВнешнихПользователей, "2", "");
		Если ЭтотОбъект[ИмяВФорме + "Включить"] Тогда
			Настройки[КлючИЗначение.Ключ] = ЭтотОбъект[ИмяВФорме];
		Иначе
			Настройки[КлючИЗначение.Ключ] = 0;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьВСпискеВыбораОбработкаВыбораЗавершение(Ответ, ВыбранноеЗначение) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ПоказыватьВСпискеВыбора = ВыбранноеЗначение;
		ПодтвержденоМассовоеИзменениеСвойстваПоказыватьВСпискеВыбора = Истина;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти
